#include <iostream>

using std::cout;
using std::endl;

class Point
{
public:
    //作用：为了完成数据成员的初始化
    //默认情况下，编译器会自动生成一个默认（无参）构造函数
    //
    //如果自定义了构造函数，那么编译器就不会再提供无参（默认）构造
    //函数
    //如果就想创建无参的对象，必须要显示的将编译器为我们提供的无参
    //（默认）构造函数写出来
    //
    //构造函数是可以进行重载
    //
    Point()
    : _ix(0)//初始化列表（初始化表达式）
    , _iy(0)
    {
        /* int a = 10; */
        /* int b = a; */
        /* int c(10); */
        /* _ix = 0;//赋值 */
        /* _iy = 0; */
        cout << "Point()" << endl;
    }

    Point(int ix, int iy)
    : _ix(ix)
    , _iy(iy)
    {
        cout << "Point(int, int)" << endl;
    }

    void print()
    {
        cout << "(" << _ix 
             << ", " << _iy
             << ")" << endl;
    }

    //作用：完成数据成员的清理操作
    //
    //默认情况下，编译器会自动生成析构函数
    //析构函数确定了函数的函数列表，函数没有返回类型，具有唯一性，
    //不能进行重载
    //当对象在离开作用域被销毁的时候，析构函数会被自动调用
    ~Point()
    {
        cout << "~Point()" << endl;
    }

private:
    int _ix;
    int _iy;
};

void test()
{
    /* int a;//栈变量 */
    Point pt;//创建对象会调用构造函数,栈对象
    /* pt.Point();//error, */
    cout << "1111" << endl;
    Point().print();//显示调用构造函数会创建对象，然后该对象会立马销毁
    cout << "2222" << endl;


    cout << "pt = ";
    pt.print();
    pt.~Point();//析构函数是可以显示调用的

    cout << endl;
    Point pt2(3, 4);//创建对象pt2,栈对象
    cout << "pt2 = ";
    pt2.print();
}


int main(int argc, char **argv)
{
    cout << "begin test..." << endl;
    test();
    cout << "finish test..." << endl;
    return 0;
}

